model button: Add a role for titles
authorMatthias Clasen <mclasen@redhat.com>
Wed, 5 Jun 2019 21:22:01 +0000 (21:22 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 9 Jun 2019 17:38:53 +0000 (17:38 +0000)
This gets us out of using direct presentational
markup like 'inverted' and 'centered' and will
make it easier to play with different layout.

Use the new role when creating popover
menus from models.

gtk/gtkmenusectionbox.c
gtk/gtkmodelbutton.c
gtk/gtkmodelbutton.h

index 7439345373bbc20aa5af3411c51f4c646b57d92d..ee1dd1b553b8e89f625964270227d670b11e785c 100644 (file)
@@ -454,8 +454,7 @@ gtk_menu_section_box_new_submenu (GtkMenuTrackerItem *item,
 
   button = g_object_new (GTK_TYPE_MODEL_BUTTON,
                          "menu-name", name,
-                         "inverted", TRUE,
-                         "centered", TRUE,
+                         "role", GTK_BUTTON_ROLE_TITLE,
                          NULL);
 
   g_object_bind_property (item, "label", button, "text", G_BINDING_SYNC_CREATE);
index 25dbbe67486ed19e2a44059f5a3aa251eeb0c1cd..6de73b6e056bfee1858e58a64694bf9fde58de66 100644 (file)
@@ -196,13 +196,15 @@ gtk_model_button_update_state (GtkModelButton *button)
 {
   GtkStateFlags state;
   GtkStateFlags indicator_state;
-  GtkCssImageBuiltinType image_type = GTK_CSS_IMAGE_BUILTIN_NONE;
+  GtkCssImageBuiltinType image_type;
 
   state = gtk_widget_get_state_flags (GTK_WIDGET (button));
   indicator_state = state;
+  image_type = GTK_CSS_IMAGE_BUILTIN_NONE;
 
-  if (button->role == GTK_BUTTON_ROLE_CHECK)
+  switch (button->role)
     {
+    case GTK_BUTTON_ROLE_CHECK:
       if (button->active && !button->menu_name)
         {
           indicator_state |= GTK_STATE_FLAG_CHECKED;
@@ -212,9 +214,9 @@ gtk_model_button_update_state (GtkModelButton *button)
         {
           indicator_state &= ~GTK_STATE_FLAG_CHECKED;
         }
-    }
-  if (button->role == GTK_BUTTON_ROLE_RADIO)
-    {
+      break;
+
+    case GTK_BUTTON_ROLE_RADIO:
       if (button->active && !button->menu_name)
         {
           indicator_state |= GTK_STATE_FLAG_CHECKED;
@@ -224,14 +226,28 @@ gtk_model_button_update_state (GtkModelButton *button)
         {
           indicator_state &= ~GTK_STATE_FLAG_CHECKED;
         }
-    }
+      break;
 
-  if (button->menu_name)
-    {
-      if (indicator_is_left (GTK_WIDGET (button)))
-        image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT;
-      else
-        image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT;
+    case GTK_BUTTON_ROLE_TITLE:
+      g_object_set (button,
+                    "inverted", TRUE,
+                    "centered", TRUE,
+                    NULL);
+      /* fall through */
+
+    case GTK_BUTTON_ROLE_NORMAL:
+      if (button->menu_name != NULL)
+        {
+          if (indicator_is_left (GTK_WIDGET (button)))
+            image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_LEFT;
+          else
+            image_type = GTK_CSS_IMAGE_BUILTIN_ARROW_RIGHT;
+        }
+
+      break;
+
+    default:
+      g_assert_not_reached ();
     }
 
   gtk_icon_set_image (GTK_ICON (button->indicator_widget), image_type);
@@ -305,6 +321,7 @@ update_node_name (GtkModelButton *button)
   switch (button->role)
     {
     case GTK_BUTTON_ROLE_NORMAL:
+    case GTK_BUTTON_ROLE_TITLE:
       a11y_role = ATK_ROLE_PUSH_BUTTON;
       if (button->menu_name)
         {
@@ -353,8 +370,8 @@ gtk_model_button_set_role (GtkModelButton *button,
   button->role = role;
 
   update_node_name (button);
-
   gtk_model_button_update_state (button);
+
   gtk_widget_queue_draw (GTK_WIDGET (button));
   g_object_notify_by_pspec (G_OBJECT (button), properties[PROP_ROLE]);
 }
index c5590460a00cb17018f6dd7b7169ef4bd3453c62..dde881da08949f8b18238eddaa18cd900ab00845 100644 (file)
@@ -41,13 +41,15 @@ typedef struct _GtkModelButton        GtkModelButton;
  * @GTK_BUTTON_ROLE_NORMAL: A plain button
  * @GTK_BUTTON_ROLE_CHECK: A check button
  * @GTK_BUTTON_ROLE_RADIO: A radio button
+ * @GTK_BUTTON_ROLE_TITLE: The title for a submenu
  *
  * The role specifies the desired appearance of a #GtkModelButton.
  */
 typedef enum {
   GTK_BUTTON_ROLE_NORMAL,
   GTK_BUTTON_ROLE_CHECK,
-  GTK_BUTTON_ROLE_RADIO
+  GTK_BUTTON_ROLE_RADIO,
+  GTK_BUTTON_ROLE_TITLE
 } GtkButtonRole;
 
 GDK_AVAILABLE_IN_ALL